package cn.dduan.fool.data.type.base.floating;

import java.math.BigDecimal;

/**
 * 单精度浮点数
 * <p>
 * 注意：
 * 1. 浮点数存在丢失精度问题
 * 2. 因为浮点数32位由：1位符号，8位指数和23位尾数（小数部分），本身已经丢失精度了
 * <p>
 * 解决：
 * 1. Java中使用BigDecimal来解决丢失精度问题
 * <p>
 * BigDecimal：
 * 1. 使用 BigDecimal 申明浮点数，一定要使用 .setScale(1, BigDecimal.ROUND_DOWN) 设置保留小数位
 * 2. 使用 BigDecimal 申明字符串数字没有问题，不存在丢失进度问题
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/12
 */
public class MyFloat {
    public static void main(String[] args) {
        float a = 1f;
        float b = 0.9f;
        float c = 3f;
        System.out.println("a = " + a); // a = 1.0
        System.out.println("b = " + b); // b = 0.9
        System.out.println("a - b = " + (a - b)); // a - b = 0.100000024
        System.out.println("a / c = " + (a / c)); // a / c = 0.33333334

        BigDecimal a1 = new BigDecimal(1);
        BigDecimal b1 = new BigDecimal("0.9");
        BigDecimal b2 = new BigDecimal(0.9).setScale(1, BigDecimal.ROUND_DOWN);
        BigDecimal c1 = new BigDecimal(3);
        System.out.println("a1 = " + a1); // a1 = 1
        System.out.println("b1 = " + b1); // b1 = 0.90000000000000002220446049250313080847263336181640625
        System.out.println("b2 = " + b2); // b2 = 0.9
        System.out.println("a1 - b1 = " + a1.subtract(b1)); // a1 - b1 = 0.09999999999999997779553950749686919152736663818359375
        System.out.println("a1 - b2 = " + a1.subtract(b2).setScale(2, BigDecimal.ROUND_DOWN)); // a1 - b2 = 0.10
        System.out.println("a1 / c1 = " + a1.divide(c1, 2, BigDecimal.ROUND_DOWN)); // a1 / c1 = 0.33
    }
}
